/*
 * ContextMenu - jQuery plugin for right-click context menus
 *
 * Author: Chris Domigan
 * Contributors: Dan G. Switzer, II
 * Parts of this plugin are inspired by Joern Zaefferer's Tooltip plugin
 *
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 *
 * Version: r2
 * Date: 16 July 2007
 *
 * For documentation visit http://www.trendskitchens.co.nz/jquery/contextmenu/
 *
 */

(function ($) {

    var menu, shadow, trigger, content, hash, currentTarget;
    var defaults = {
        menuStyle: {
            /* listStyle: 'none',
             padding: '1px',
             margin: '0px',
             backgroundColor: '#fff',
             border: '1px solid #999',
             width: '100px'*/
        },
        itemStyle: {
            /*margin: '0px',
             color: '#000',
             display: 'block',
             cursor: 'default',
             padding: '3px',
             border: '1px solid #fff',
             backgroundColor: 'transparent'*/
        },
        itemHoverStyle: {
            /* border: '1px solid #0a246a',
             backgroundColor: '#b6bdd2'*/
        },
        eventPosX: 'pageX',
        eventPosY: 'pageY',
        shadow: false,
        onContextMenu: null,
        onShowMenu: null,
        defaults: null
    };

    $.fn.contextMenu = function (id, options) {
        if (!menu) {                                      // Create singleton menu
            menu = $('<div/>')
                .hide()
                .css({position: 'absolute', zIndex: '99999'})
                .appendTo('body')
                .bind('click', function (e) {
                    //e.stopPropagation();
                });
        }
        if (!shadow) {
            shadow = $('<div></div>')
                .css({backgroundColor: '#000', position: 'absolute', opacity: 0.2, zIndex: 499})
                .appendTo('body')
                .hide();
        }
        hash = hash || [];
        if (!options) {
            options = defaults;
        }
        hash.push({
            id: id,
            menuStyle: $.extend({}, defaults.menuStyle, options.menuStyle || {}),
            itemStyle: $.extend({}, defaults.itemStyle, options.itemStyle || {}),
            itemHoverStyle: $.extend({}, defaults.itemHoverStyle, options.itemHoverStyle || {}),
            bindings: options.bindings || {},
            shadow: options.shadow || options.shadow === false ? options.shadow : defaults.shadow,
            onContextMenu: options.onContextMenu || defaults.onContextMenu,
            onShowMenu: options.onShowMenu || defaults.onShowMenu,
            eventPosX: options.eventPosX || defaults.eventPosX,
            eventPosY: options.eventPosY || defaults.eventPosY
        });

        var index = hash.length - 1;
        $(this).bind('contextmenu', function (e) {
            var bShowContext = (!!hash[index].onContextMenu) ? hash[index].onContextMenu(e) : true;
            if (bShowContext) display(index, this, e, options);
            return false;
        });
        return this;
    };

    function display(index, trigger, e, options) {
        var cur = hash[index];
        //content = $('#'+cur.id).find('ul:first').clone(true);
        content = $("<div>", {
            "class": "list-group right-context-menu",
            "style": "box-shadow:0 0 10px rgba(207, 212, 212, 0.5);width:120px;margin-bottom:0"
        }).html($('#' + cur.id).html());
        var $menu_list = content.children("a");

        $menu_list.addClass("list-group-item");
        /* content.css(cur.menuStyle).find('li').css(cur.itemStyle).hover(
         function() {
         $(this).css(cur.itemHoverStyle);
         },
         function(){
         $(this).css(cur.itemStyle);
         }
         ).find('img').css({verticalAlign:'middle',paddingRight:'2px'});*/

        // Send the content to the menu
        menu.html(content);
        // if there's an onShowMenu, run it now -- must run after content has been added
        // if you try to alter the content variable before the menu.html(), IE6 has issues
        // updating the content
        if (!!cur.onShowMenu) menu = cur.onShowMenu(e, menu);

        $.each(cur.bindings, function (id, func) {
            $('#' + id, menu).bind('click', function (e) {
                hide();
                func(trigger, currentTarget);
            });
        });
        $menu_list.off("click.contextmenu").on("click.contextmenu", function () {
            hide();
        });
        menu.css({'left': e[cur.eventPosX], 'top': e[cur.eventPosY]}).show();
        if (cur.shadow) shadow.css({width: menu.width(), height: menu.height(), left: e.pageX + 2, top: e.pageY + 2}).show();
        $(document).one('click', hide);
    }

    function hide() {
        menu.hide();
        shadow.hide();
    }

    // Apply defaults
    $.contextMenu = {
        defaults: function (userDefaults) {
            $.each(userDefaults, function (i, val) {
                if (typeof val == 'object' && defaults[i]) {
                    $.extend(defaults[i], val);
                }
                else defaults[i] = val;
            });
        }
    };

})(jQuery);